//package com.yc.mypredicatefactory;
//
//import org.lionsoul.ip2region.xdb.Searcher;
//import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
//import org.springframework.http.server.reactive.ServerHttpRequest;
//import org.springframework.stereotype.Component;
//import org.springframework.util.StringUtils;
//import org.springframework.web.server.ServerWebExchange;
//
//import java.io.IOException;
//import java.util.List;
//import java.util.function.Predicate;
//
//@Component
//public class GeoIpRoutePredicateFactory extends AbstractRoutePredicateFactory<GeoIpRoutePredicateFactory.Config> {
//
//    private final Searcher searcher;
//
//    public GeoIpRoutePredicateFactory() throws IOException {
//        super(Config.class);
//        // 加载 ip2region xdb 数据库文件，放在resources/ip2region.xdb
//        this.searcher = Searcher.newWithFileOnly(getClass().getClassLoader().getResource("ip2region.xdb").getPath());
//    }
//
//    @Override
//    public Predicate<ServerWebExchange> apply(Config config) {
//        return exchange -> {
//            ServerHttpRequest request = exchange.getRequest();
//
//            // 获取客户端IP，优先取X-Forwarded-For，防止代理影响
//            String ip = getClientIp(request);
//            if (!StringUtils.hasText(ip)) {
//                return false;
//            }
//
//            try {
//                String region = searcher.search(ip);
//                // region 格式类似: "中国|0|浙江省|杭州市|阿里巴巴"
//                // 你可以拆分字符串判断国家字段
//                if (region == null) {
//                    return false;
//                }
//
//                // 简单示例，允许国家为中国（"中国"）
//                String country = region.split("\\|")[0];
//                if (config.getAllowedCountries().contains(country)) {
//                    return true;
//                } else {
//                    return false;
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//                return false;
//            }
//        };
//    }
//
//    private String getClientIp(ServerHttpRequest request) {
//        List<String> xff = request.getHeaders().get("X-Forwarded-For");
//        if (xff != null && !xff.isEmpty()) {
//            return xff.get(0).split(",")[0].trim();
//        }
//        return request.getRemoteAddress() != null ? request.getRemoteAddress().getAddress().getHostAddress() : null;
//    }
//
//    public static class Config {
//        // 允许的国家列表
//        private List<String> allowedCountries;
//
//        public List<String> getAllowedCountries() {
//            return allowedCountries;
//        }
//
//        public void setAllowedCountries(List<String> allowedCountries) {
//            this.allowedCountries = allowedCountries;
//        }
//    }
//}
